home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS in a Box 7
/
BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso
/
Files
/
Prog
/
T
/
TIFF Code.cpt
/
td.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-12-16
|
10KB
|
495 lines
#include <types.h>
#include <stdio.h>
#include "::TiffLibrary:tifflib.h"
#include "td.h"
char *tagName();
char *typeName();
unsigned short SwapShortBytes();
unsigned long SwapLongBytes();
char *gethex();
char hex();
char *pgrm;
char *filename;
TiffHeader header;
Boolean swapBytes;
main(argc, argv)
int argc;
char *argv[];
{
int fd;
Int16 ifdCount;
int ifdOffset;
int ifdNum;
pgrm = argv[0];
if (argc != 2) {
fprintf(stderr, "usage: %s file\n", argv[0]);
exit(1);
}
filename = argv[1];
if ((fd = open(filename, 0)) < 0) {
fprintf(stderr, "%s: can't open %s\n", pgrm, filename);
exit(1);
}
if (read(fd, &header, sizeof(header)) != sizeof(header)) {
fprintf(stderr, "%s: can't read %s\n", pgrm, filename);
exit(1);
}
if (header.byteOrder == INTEL) {
swapBytes = true;
header.version = SwapShortBytes(header.version);
header.dirOffset = SwapLongBytes(header.dirOffset);
}
else
swapBytes = false;
printf("\nTIFF FILE %s:\n\nHeader:\n\n", filename);
printf("\tbyteorder='%c%c'(0x%X)\n\tversion=%d(0x%X)\n\tdirOffset=0x%lX\n",
header.byteOrder,
header.byteOrder, header.byteOrder >> 8,
header.version,
header.version,
header.dirOffset);
ifdOffset = header.dirOffset;
for (ifdNum = 0; ifdOffset != 0; ifdNum++)
ifdOffset = readIFD(fd, ifdOffset);
close(fd);
}
Int32 readIFD(fd, ifdOffset)
Int32 ifdOffset;
{
unsigned char *pByte;
int i;
UInt16 ifdCount,
*pShort;
TiffDirEntry ifdEntry;
UInt32 offset;
if (lseek(fd, ifdOffset, 0) < 0) {
fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
exit(1);
}
readShort(fd, &ifdCount);
printf("\nIFD: 0x%X(%d.) entries @0x%lX:\n\n",
ifdCount,
ifdCount,
ifdOffset);
for (i = 0; i < ifdCount; i++) {
if (read(fd, &ifdEntry, sizeof(ifdEntry)) != sizeof(ifdEntry)) {
fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
exit(1);
}
if (swapBytes) {
ifdEntry.tag = SwapShortBytes(ifdEntry.tag);
ifdEntry.type = SwapShortBytes(ifdEntry.type);
ifdEntry.length = SwapLongBytes(ifdEntry.length);
if ( ((ifdEntry.length * typeSize(ifdEntry.type)) > 4) ||
(ifdEntry.type == LONG) ) {
/* it's a long value or a long offset so swap it */
ifdEntry.valueOffset = SwapLongBytes(ifdEntry.valueOffset);
}
else if (ifdEntry.type == SHORT) {
/* it's either one or two shorts, swap both anyway */
pShort = (Int16 *)&ifdEntry.valueOffset;
*pShort++ = SwapShortBytes(*pShort);
*pShort = SwapShortBytes(*pShort);
}
/* else type must be BYTE or ASCII so now swap needed */
}
printf("%s %3ld %s:",
tagName(ifdEntry.tag), ifdEntry.length, typeName(ifdEntry.type));
printValue(fd, ifdEntry.type, ifdEntry.length, ifdEntry.valueOffset);
}
readLong(fd, &ifdOffset);
return(ifdOffset);
}
printValue(fd, type, length, offset)
int fd;
UInt16 type;
UInt32 length, offset;
{
static char buf[80];
unsigned char *p;
unsigned char Byte;
unsigned short Short;
unsigned long Long;
Rational Rat;
int size;
UInt32 n, oldOffset;
size = typeSize(type);
if ((size * length) <= 4) { /* value(s) in directory entry */
if (type == ASCII)
putchar('"');
for (n = 0; n < length; n++) {
switch (type) {
case BYTE:
printf("0x%X ", (int)( ((unsigned char *)(&offset))[n]));
break;
case ASCII:
printf("%c", (int)( ((unsigned char *)(&offset))[n]));
break;
case SHORT:
printf("0x%X ", (int)( ((unsigned short *)(&offset))[n]));
break;
case LONG:
printf("0x%lX ", offset);
break;
}
}
if (type == ASCII)
putchar('"');
}
else { /* value(s) at given offset */
printf("values @0x%lX:",offset);
if ((oldOffset = lseek(fd, 0L, 1)) < 0) {
fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
exit(1);
}
if (lseek(fd, offset, 0) < 0) {
fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
exit(1);
}
putchar('\n');
if (type == ASCII)
printf("\t\"");
for (n = 0; n < length; n++) {
if (type != ASCII)
putchar('\t');
switch (type) {
case BYTE:
readByte(fd, &Byte);
sprintf(buf, "0x%lX", Byte);
pad(buf, 2 + (2 * sizeof(Byte)));
printf("%s", buf);
break;
case ASCII:
readByte(fd, &Byte);
putchar(Byte);
break;
case SHORT:
readShort(fd, &Short);
sprintf(buf, "0x%lX", Short);
pad(buf, 2 + (2 * sizeof(Short)));
printf("%s", buf);
break;
case LONG:
readLong(fd, &Long);
sprintf(buf, "0x%lX", Long);
pad(buf, 2 + (2 * sizeof(Long)));
printf("%s", buf);
break;
case RATIONAL:
readRational(fd, &Rat);
printf("%s/", gethex(Rat.numerator, sizeof(Rat.numerator)));
sprintf(buf, "0x%lX", Rat.denominator);
pad(buf, 2 + (2 * sizeof(Long)));
printf("%s", buf);
break;
}
if ((type != ASCII) && (n % 4 == 3))
putchar('\n');
}
if (type == ASCII)
putchar('"');
if (lseek(fd, oldOffset, 0) < 0) {
fprintf(stderr, "%s: seek error: %s\n", pgrm, filename);
exit(1);
}
}
putchar('\n');
}
typeSize(type)
Int16 type;
{
switch (type) {
case BYTE:
return(BYTESIZE);
break;
case ASCII:
return(ASCIISIZE);
break;
case SHORT:
return(SHORTSIZE);
break;
case LONG:
return(LONG);
break;
case RATIONAL:
return(RATSIZE);
break;
}
}
char *tagName(tag)
Int16 tag;
{
static char buf[80];
switch (tag) {
case SUBFILE_TYPE_TAG:
sprintf(buf, "SubfileType");
break;
case IMAGE_WIDTH_TAG:
sprintf(buf, "ImageWidth");
break;
case IMAGE_LENGTH_TAG:
sprintf(buf, "ImageLength");
break;
case BITS_PER_SAMPLE_TAG:
sprintf(buf, "BitsPerSample");
break;
case COMPRESSION_TAG:
sprintf(buf, "Compression");
break;
case PHOTOMETRIC_INTERP_TAG:
sprintf(buf, "PhotometricInterpretation");
break;
case THRESHOLDING_TAG:
sprintf(buf, "Threshholding");
break;
case CELL_WIDTH_TAG:
sprintf(buf, "CellWidth");
break;
case CELL_LENGTH_TAG:
sprintf(buf, "CellLength");
break;
case FILL_ORDER_TAG:
sprintf(buf, "FillOrder");
break;
case DOCUMENT_NAME_TAG:
sprintf(buf, "DocumentName");
break;
case IMAGE_DESCRIPTION_TAG:
sprintf(buf, "ImageDescription");
break;
case MAKE_TAG:
sprintf(buf, "Make");
break;
case MODEL_TAG:
sprintf(buf, "Model");
break;
case STRIP_OFFSETS_TAG:
sprintf(buf, "StripOffsets");
break;
case ORIENTATION_TAG:
sprintf(buf, "Orientation");
break;
case SAMPLES_PER_PIXEL_TAG:
sprintf(buf, "SamplesPerPixel");
break;
case ROWS_PER_STRIP_TAG:
sprintf(buf, "RowsPerStrip");
break;
case STRIP_BYTE_COUNTS_TAG:
sprintf(buf, "StripByteCounts");
break;
case MIN_SAMPLE_VALUE_TAG:
sprintf(buf, "MinSampleValue");
break;
case MAX_SAMPLE_VALUE_TAG:
sprintf(buf, "MaxSampleValue");
break;
case X_RESOLUTION_TAG:
sprintf(buf, "XResolution");
break;
case Y_RESOLUTION_TAG:
sprintf(buf, "YResolution");
break;
case PLANAR_CONFIG_TAG:
sprintf(buf, "PlanarConfiguration");
break;
case PAGE_NAME_TAG:
sprintf(buf, "PageName");
break;
case X_POSITION_TAG:
sprintf(buf, "XPosition");
break;
case Y_POSITION_TAG:
sprintf(buf, "YPosition");
break;
case FREE_OFFSETS_TAG:
sprintf(buf, "FreeOffsets");
break;
case FREE_BYTE_COUNTS_TAG:
sprintf(buf, "FreeByteCounts");
break;
case UNITS_GRAY_RESPONSE:
sprintf(buf, "GrayResponseUnit");
break;
case CURVE_GRAY_RESPONSE:
sprintf(buf, "GrayResponseCurve");
break;
case 0x124: /* Group3Options */
sprintf(buf, "name");
break;
case 0x125: /* Group4Options */
sprintf(buf, "name");
break;
case 0x128: /* ResolutionUnit */
sprintf(buf, "name");
break;
case 0x129: /* PageNumber */
sprintf(buf, "name");
break;
case 0x12C: /* ColorResponseUnit */
sprintf(buf, "name");
break;
case 0x12D: /* ColorResponseCurves */
sprintf(buf, "name");
break;
default:
sprintf(buf, "%03x", tag);
break;
}
pad(buf, strlen("PhotometricInterpretation"));
return(buf);
}
char *typeName(type)
Int16 type;
{
switch (type) {
case BYTE:
return("Byte ");
break;
case ASCII:
return("Ascii ");
break;
case SHORT:
return("Short ");
break;
case LONG:
return("Long ");
break;
case RATIONAL:
return("Rational");
break;
}
}
pad(buf, n)
char *buf;
int n;
{
register char *pStart, *pEnd;
pEnd = buf + n;
pStart = buf;
while (*pStart != '\0')
pStart++;
while (pStart <= pEnd) {
*pStart++ = ' ';
}
*pStart = '\0';
}
unsigned short SwapShortBytes(s)
register unsigned short s;
{
s = (s >> 8) | (s << 8);
return(s);
}
unsigned long SwapLongBytes(l)
register unsigned long l;
{
l = ((l >> 24) ) |
((l >> 8) & 0x0000FF00 ) |
((l << 8) & 0x00FF0000 ) |
((l << 24) );
return(l);
}
readByte(fd, byteBuf)
char *byteBuf;
{
if (read(fd, byteBuf, BYTESIZE) != BYTESIZE) {
fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
exit(1);
}
}
readShort(fd, shortBuf)
short *shortBuf;
{
if (read(fd, shortBuf, SHORTSIZE) != SHORTSIZE) {
fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
exit(1);
}
if (swapBytes)
*shortBuf = SwapShortBytes(*shortBuf);
}
readLong(fd, longBuf)
long *longBuf;
{
if (read(fd, longBuf, LONGSIZE) != LONGSIZE) {
fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
exit(1);
}
if (swapBytes)
*longBuf = SwapLongBytes(*longBuf);
}
readRational(fd, ratBuf)
Rational *ratBuf;
{
if (read(fd, ratBuf, RATSIZE) != RATSIZE) {
fprintf(stderr, "%s: read error: %s\n", pgrm, filename);
exit(1);
}
if (swapBytes) {
ratBuf->numerator = SwapLongBytes(ratBuf->numerator);
ratBuf->denominator = SwapLongBytes(ratBuf->denominator);
}
}
#define LFMTSIZE 2
#define LMAXDIGITS 8
char *gethex(value, size)
int size;
register unsigned long value;
{
register char *p;
register int i;
static char buf[LFMTSIZE + LMAXDIGITS + 1];
static char fmt[LFMTSIZE] = "0x";
if ((size * 2) > LMAXDIGITS)
return("########");
p = &buf[(size * 2) + LFMTSIZE];
*p-- = '\0'; /* null terminate */
while (value > 0) { /* put hex val at end of buffer */
*p-- = hex(value % 0x10);
value /= 0x10;
}
for (i = (LFMTSIZE - 1); i >= 0 ; i--) /* prepend format */
*p-- = fmt[i];
while (p >= buf) /* put in leading blanks */
*p-- = ' ';
return(buf);
}
char hex(val)
{
if ((val > 0) && (val < 10))
return(val + '0');
else if (val < 0x10)
return(val - 0xA + 'A');
else
return('#');
}